#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
文件处理工具模块

提供文件大小格式化、分享码验证等文件相关的工具函数
"""

import re
import os
from typing import Optional


def format_file_size(size_bytes: int) -> str:
    """
    格式化文件大小
    
    Args:
        size_bytes: 文件大小（字节）
        
    Returns:
        格式化后的文件大小字符串
    """
    if size_bytes == 0:
        return "0 B"
    
    size_names = ["B", "KB", "MB", "GB", "TB", "PB"]
    i = 0
    size = float(size_bytes)
    
    while size >= 1024.0 and i < len(size_names) - 1:
        size /= 1024.0
        i += 1
    
    return f"{size:.1f} {size_names[i]}"


def validate_share_code(share_code: str) -> bool:
    """
    验证分享码格式
    
    Args:
        share_code: 分享码
        
    Returns:
        是否为有效的分享码格式
    """
    if not share_code or not isinstance(share_code, str):
        return False
    
    # 天翼云盘分享码格式：通常是字母数字组合，长度在6-20之间
    pattern = r'^[a-zA-Z0-9]{6,20}$'
    return bool(re.match(pattern, share_code))


def sanitize_filename(filename: str) -> str:
    """
    清理文件名，移除不安全字符
    
    Args:
        filename: 原始文件名
        
    Returns:
        清理后的安全文件名
    """
    if not filename:
        return "unnamed_file"
    
    # 移除或替换不安全字符
    unsafe_chars = r'[<>:"/\\|?*]'
    safe_filename = re.sub(unsafe_chars, '_', filename)
    
    # 移除前后空格和点
    safe_filename = safe_filename.strip(' .')
    
    # 确保文件名不为空
    if not safe_filename:
        return "unnamed_file"
    
    # 限制文件名长度
    if len(safe_filename) > 255:
        name, ext = os.path.splitext(safe_filename)
        max_name_len = 255 - len(ext)
        safe_filename = name[:max_name_len] + ext
    
    return safe_filename


def get_file_extension(filename: str) -> str:
    """
    获取文件扩展名
    
    Args:
        filename: 文件名
        
    Returns:
        文件扩展名（包含点号）
    """
    if not filename:
        return ""
    
    return os.path.splitext(filename)[1].lower()


def is_image_file(filename: str) -> bool:
    """
    判断是否为图片文件
    
    Args:
        filename: 文件名
        
    Returns:
        是否为图片文件
    """
    image_extensions = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg', '.ico'}
    return get_file_extension(filename) in image_extensions


def is_video_file(filename: str) -> bool:
    """
    判断是否为视频文件
    
    Args:
        filename: 文件名
        
    Returns:
        是否为视频文件
    """
    video_extensions = {'.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm', '.m4v'}
    return get_file_extension(filename) in video_extensions


def is_audio_file(filename: str) -> bool:
    """
    判断是否为音频文件
    
    Args:
        filename: 文件名
        
    Returns:
        是否为音频文件
    """
    audio_extensions = {'.mp3', '.wav', '.flac', '.aac', '.ogg', '.wma', '.m4a'}
    return get_file_extension(filename) in audio_extensions


def is_document_file(filename: str) -> bool:
    """
    判断是否为文档文件
    
    Args:
        filename: 文件名
        
    Returns:
        是否为文档文件
    """
    document_extensions = {'.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.txt', '.rtf'}
    return get_file_extension(filename) in document_extensions


def get_mime_type(filename: str) -> str:
    """
    根据文件扩展名获取MIME类型
    
    Args:
        filename: 文件名
        
    Returns:
        MIME类型字符串
    """
    ext = get_file_extension(filename)
    
    mime_types = {
        # 图片
        '.jpg': 'image/jpeg',
        '.jpeg': 'image/jpeg',
        '.png': 'image/png',
        '.gif': 'image/gif',
        '.bmp': 'image/bmp',
        '.webp': 'image/webp',
        '.svg': 'image/svg+xml',
        '.ico': 'image/x-icon',
        
        # 视频
        '.mp4': 'video/mp4',
        '.avi': 'video/x-msvideo',
        '.mkv': 'video/x-matroska',
        '.mov': 'video/quicktime',
        '.wmv': 'video/x-ms-wmv',
        '.flv': 'video/x-flv',
        '.webm': 'video/webm',
        '.m4v': 'video/x-m4v',
        
        # 音频
        '.mp3': 'audio/mpeg',
        '.wav': 'audio/wav',
        '.flac': 'audio/flac',
        '.aac': 'audio/aac',
        '.ogg': 'audio/ogg',
        '.wma': 'audio/x-ms-wma',
        '.m4a': 'audio/mp4',
        
        # 文档
        '.pdf': 'application/pdf',
        '.doc': 'application/msword',
        '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        '.xls': 'application/vnd.ms-excel',
        '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        '.ppt': 'application/vnd.ms-powerpoint',
        '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
        '.txt': 'text/plain',
        '.rtf': 'application/rtf',
        
        # 其他
        '.zip': 'application/zip',
        '.rar': 'application/x-rar-compressed',
        '.7z': 'application/x-7z-compressed',
        '.tar': 'application/x-tar',
        '.gz': 'application/gzip',
        '.json': 'application/json',
        '.xml': 'application/xml',
        '.html': 'text/html',
        '.css': 'text/css',
        '.js': 'application/javascript',
    }
    
    return mime_types.get(ext, 'application/octet-stream')